#!/bin/bash

# 配置文件路径
config_file=$1

# 加载配置
source $config_file

# 定义颜色代码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
PLAIN='\033[0m'

# 打印信息
function print_info() {
  echo -e "${GREEN}$1${PLAIN}"
}

# 打印错误
function print_error() {
  echo -e "${RED}$1${PLAIN}"
}

# 打印警告
function print_warn() {
  echo -e "${YELLOW}$1${PLAIN}"
}

# 检查进程是否运行
function check_process() {
  pid=$(pgrep -f $APP_NAME)
  if [ -z "$pid" ]; then
    return 1
  else
    return 0
  fi
}

# 启动程序
function start_app() {
  check_process
  if [ $? -eq 0 ]; then
    print_warn "${APP_NAME} 已经在运行了. PID: ${pid}."
  else
    cd ${APP_HOME} || exit
    nohup java -Dspring.profiles.active=prod -jar ${APP_NAME} >${LOG_FILE} 2>&1 &

    print_info "${APP_NAME}程序正在启动..."
    sleep 1
    tail -10f $LOG_FILE | sed '/seconds (process running for/Q'
    print_info "${APP_NAME} 启动成功!"
  fi
}

# 停止程序
function stop_app() {
  check_process
  if [ $? -eq 0 ]; then
    kill -9 $pid
    print_info "${APP_NAME} 已成功停止运行"
  else
    print_warn "${APP_NAME} 没有在运行"
  fi
}


# 重启程序
function restart_app() {
  stop_app
  start_app
}

# 部署程序
function deploy_app() {

  startTime=`date +%Y%m%d-%H:%M:%S`
  startTime_s=`date +%s`
  make_dir

  print_info "开始发布 ${APP_NAME}..."

  # 检查目录是否存在
  if [ ! -d "${APP_CODE_PATH}" ]; then
      # 如果目录不存在,则进入上级目录

      print_info "源代码目录不存在，在[${APP_CODE_PATH_PARENT}]目录执行项目初始化操作。 "

      cd ${APP_CODE_PATH_PARENT} || exit
      # 克隆 Git 仓库
      print_info "克隆 Git 仓库，执行：git clone $git_repo "
      git clone $git_repo

      cd ${APP_CODE_PATH} || exit

  else
    cd ${APP_CODE_PATH} || exit
    print_info "拉取最新代码"
    git pull origin master
  fi


  # 编译代码
  print_info "开始编译"
  # 检查gradlew权限
  if [ ! -x ./gradlew ]; then
    chmod +x ./gradlew
  fi
  ./gradlew clean build

  # 复制可执行文件
  # *-plain.jar是spring boot 的临时文件
  jar_name=$(ls build/libs/*.jar | grep -v plain)
  cp ${jar_name} ${APP_HOME}${APP_NAME}

  # 重启
  restart_app

  # 记录日志
  echo "已经在 $(date) 发布了" >> $LOG_FILE

  endTime=`date +%Y%m%d-%H:%M:%S`
  endTime_s=`date +%s`
  sumTime=$[ $endTime_s - $startTime_s ]

  print_info "部署成功!开始时间：$startTime --->截止时间： $endTime 。耗时:$sumTime 秒"
}

# 检查程序状态
function check_status() {

  check_process

  if [ $? -eq 0 ]; then
    print_info "${APP_NAME} 正在运行. PID is ${pid}"
  else
    print_info "${APP_NAME} 已经停止"
  fi

}

# 查看帮助
function print_help() {
  echo "用法: "
  echo "  start: 启动程序"
  echo "  stop: 停止程序"
  echo "  status: 检查程序状态"
  echo "  restart: 重启程序"
  echo "  deploy: 发布新版本"
}
# 确保目录存在
make_dir(){
  if [ ! -d "$APP_HOME" ]; then
    mkdir -p $APP_HOME
  fi
  if [ ! -d "$LOG_PATH" ]; then
    mkdir -p $LOG_PATH
  fi
}

case $2 in
  "start")
    start_app
  ;;
  "stop")
    stop_app
  ;;
  "restart")
    restart_app
  ;;
  "status")
    check_status
  ;;
  "deploy")
    deploy_app
  ;;
  "help")
    print_help
  ;;
  *)
    print_error "未知的命令 $1"
    exit 1
esac
